import sys
import time

from PyQt5 import uic,QtWidgets
from PyQt5.Qt import QApplication, QWidget, QThread
from PyQt5.QtCore import pyqtSignal


class MyThread(QThread): #子线程

    forgot_progressBar=pyqtSignal(int)

    def __init__(self,signal,kwargs ):
        super().__init__()

        self.start_complete_signal=signal #将自定义信号传递过来，
        self.kwargs=kwargs

    def run(self):

        #延时 10秒
        for i in range(1,11):
            print("是MyThread线程中执行....%d" % (i + 1))
            time.sleep(1)
            self.forgot_progressBar.emit(i*10)

        self.start_complete_signal.emit(f'子线程，运行完成:{self.kwargs}') #给自定义信号发送消息



class MyWin(QWidget):#主线程 主界面


    # 声明一个信号，只能写在函数外面
    forgot_status_signal = pyqtSignal(str) #自定义信号，接受子线程，执行完成的消息

    def __init__(self):
        super().__init__()
        self.init_ui()

    def init_ui(self):#主界面元素


        self.ui = uic.loadUi("./qt_ui/login_ui.ui") # 加载 qt 设计师，设计出的ui

        # 从ui文件中加载控件
        login_btn1 = self.ui.pushButton #登录按钮
        forgot_btn2 = self.ui.pushButton_2  #忘记密码按钮

        # 给2个按钮绑定槽函数
        login_btn1.clicked.connect(self.login)  # 绑定登录按钮的槽函数
        forgot_btn2.clicked.connect(self.forgot_password)  # 绑定忘记密码按钮的槽函数

        self.forgot_status_signal.connect(self.forgot_status) #绑定自定义信号的槽函数，收到子线程消息，执行绑定的槽函数


    def login(self): #登录按钮绑定的槽函数，主线程执行，出现卡顿
        self.ui.pushButton.setEnabled(False)  # 开启按钮
        #耗时 延时10秒
        for i in range(1,11):
            print("是UI线程中执行....%d" % (i + 1))
            time.sleep(1)
            self.update_forgot_progressBar( i*10)


        user_name=self.ui.lineEdit.text() #获取账号输入框text信息
        password = self.ui.lineEdit_2.text()  #获取密码输入框text信息

        dic={
            "user_name":user_name,
            "password":password
        }

        #将返回消息写入显示框
        self.ui.textEdit.setText(f'主线程运行完成：{dic}')
        #输入框刷新显示
        self.ui.textEdit.repaint()

        # 对话框弹框
        QtWidgets.QMessageBox.information(None, '主线程', f'主线程运行完成：{dic}', QtWidgets.QMessageBox.Yes | QtWidgets.QMessageBox.No,
                                          QtWidgets.QMessageBox.Yes)
        self.ui.pushButton.setEnabled(True)  # 开启按钮


    def forgot_password(self): #忘记密码按钮 绑定的槽函数，执行后启动子线程
        self.ui.pushButton_2.setEnabled(False)  # 开启按钮
        user_name=self.ui.lineEdit.text() #获取账号输入框text信息
        password = self.ui.lineEdit_2.text()  #获取密码输入框text信息

        dic={
            "user_name":user_name,
            "password":password
        }


        self.my_thread = MyThread(self.forgot_status_signal,dic)  # 创建线程
        self.my_thread.forgot_progressBar.connect(self.update_forgot_progressBar)
        self.my_thread.start()  # 开始线程 启动子线程执行任务



    def update_forgot_progressBar(self,value):
        self.ui.progressBar.setValue(value)

    def forgot_status(self,srt): #收到子线程消息,执行绑定的槽函数
        print(f'收到子线程消息：{srt}')
        print("主线程：收到了槽函数，打印消息")

        #将返回消息写入显示框
        self.ui.textEdit.setText(srt)
        #输入框刷新显示
        self.ui.textEdit.repaint()

        # 对话框弹框
        QtWidgets.QMessageBox.information(None, '主线程打印', srt, QtWidgets.QMessageBox.Yes | QtWidgets.QMessageBox.No,
                                          QtWidgets.QMessageBox.Yes)

        self.ui.pushButton_2.setEnabled(True)  # 开启按钮


if __name__ == "__main__":
    app = QApplication(sys.argv)
    myshow = MyWin()
    myshow.ui.show()
    app.exec()
